package org.lc.cmd.util;

import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import java.lang.annotation.Annotation;
import java.util.Map;


@Component
public class ContextUtil {
    private static ApplicationContext context;

    public ContextUtil(ApplicationContext context) {
        ContextUtil.context = context;
    }

    @SuppressWarnings("unused")
    public static ApplicationContext getContext() {
        return context;
    }

    /**
     * 通过Bean名称从ApplicationContext中获取Bean实例
     *
     * @param beanName Bean的名称
     * @param <T> Bean的类型
     * @return 返回找到的Bean实例，如果未找到则返回null
     */
    @SuppressWarnings({"unchecked", "unused"})
    public static <T> T getBean(String beanName) {
        return (T) context.getBean(beanName);
    }

    /**
     * 通过类型从ApplicationContext中获取Bean实例
     *
     * @param requiredType Bean的类型
     * @param <T> Bean的泛型
     * @return 返回找到的Bean实例，如果未找到则返回null
     */
    public static <T> T getBean(Class<T> requiredType) {
        return context.getBean(requiredType);
    }

    /**
     * 通过Bean名称和类型从ApplicationContext中获取Bean实例
     *
     * @param beanName Bean的名称
     * @param requiredType Bean的类型
     * @param <T> Bean的泛型
     * @return 返回找到的Bean实例，如果未找到则返回null
     */
    @SuppressWarnings("unused")
    public static <T> T getBean(String beanName, Class<T> requiredType) {
        return context.getBean(beanName, requiredType);
    }

    /**
     * 通过类型和参数从ApplicationContext中获取Bean实例
     *
     * @param requiredType Bean的类型
     * @param args 构造函数参数
     * @param <T> Bean的泛型
     * @return 返回找到的Bean实例，如果未找到则返回null
     */
    @SuppressWarnings("unused")
    public static <T> T getBean(Class<T> requiredType, Object... args) {
        return context.getBean(requiredType, args);
    }

    /**
     * 通过类型从ApplicationContext中获取所有符合该类型的Bean实例
     *
     * @param requiredType Bean的类型
     * @param <T> Bean的泛型
     * @return 返回找到的所有符合类型要求的Bean实例的Map，如果未找到则返回空Map
     */
    @SuppressWarnings("unused")
    public static <T> Map<String, T> getBeansOfType(Class<T> requiredType) {
        return context.getBeansOfType(requiredType);
    }

    /**
     * 通过注解类型从ApplicationContext中获取所有使用该注解的Bean实例
     *
     * @param annotationType 注解类型
     * @param <T> Bean的泛型
     * @return 返回找到的所有带有指定注解的Bean实例的Map，如果未找到则返回空Map
     */
    public static <T extends Annotation> Map<String, Object> getBeansWithAnnotation(Class<T> annotationType) {
        return context.getBeansWithAnnotation(annotationType);
    }
}
